package com.major.tree.threadbinary;

public class ThreadBinaryTree {
    private ThreadNode root;
    private ThreadNode preNode;

    public ThreadNode getRoot() {
        return root;
    }

    public void setRoot(ThreadNode root) {
        this.root = root;
    }

    // 中序遍历线索化二叉树
    public void threadIterate() {
        ThreadNode node = root;
        while (node != null) {
            // 会一直往左边找
            while (node.getLeftType() == 0) {
                node = node.getLeftNode();
            }
            System.out.println(node);       // ##只输出叶子结点
            // 如果右指针指向后继结点，就一直输出
            // 如果不把后继结点输出完的话，回到上面就会滑到最左边，形成死循环。我把它命名为：抗左滑循环（又称马约尔循环）
            while (node.getRightType() == 1){
                node = node.getRightNode();         // ++后继结点
                System.out.println(node);   // ##只输出非叶子结点
            }
            node = node.getRightNode();             // ++右儿子，正常右结点
        }
    }

    // 中序线索化二叉树
    public void threadNodes() {
        threadNodes(root);
    }

    public void threadNodes(ThreadNode node) {
        // 如果该结点为空
        if (node == null) {
            return;
        }
        // 处理左子树
        threadNodes(node.getLeftNode());

        // 处理当前结点
        // 处理前驱结点
        if (node.getLeftNode() == null) {
            node.setLeftNode(preNode);
            node.setLeftType(1);
        }
        // 处理后继结点
        if (preNode != null && preNode.getRightNode() == null) {
            preNode.setRightNode(node);
            preNode.setRightType(1);
        }
        preNode = node;

        // 处理右子树
        threadNodes(node.getRightNode());
    }


    // 查询结点，中序
    public ThreadNode getNodeByNo(int no) {

        ThreadNode node = root.getNodeByNo(no);
        if (node == null) {
            throw new RuntimeException("可能不存在该节点");
        }
        return node;
    }


    // 删除结点
    public void deleteNode(int no) {
        if (root != null) {
            if (root.getNo() == no) {
                root = null;
            } else {
                root.deleteByNo(no);
            }
        } else {
            System.out.println("空树");
        }
    }

    // 中序遍历
    public void inoOrder() {
        if (this.root != null) {
            // 遍历
            this.root.inoOrder();
        } else {
            System.out.println("链表为空");
        }
    }
}

